package negocio;

import java.util.Date;
import java.util.List;

import persistencia.PersistenciaAto;
import entidades.Ato;

public class NegocioAto {
	private PersistenciaAto persistencia;
	private Ato ato;
	
	public NegocioAto(String endereco, String login, String senha){
		persistencia = new PersistenciaAto(endereco, login, senha);
	}
	
	public boolean criar(String processo, String observacao, String statusAtual, Date dataRegistro, Date dataTermino, int idPrazo, int idProprietario) {
		ato = new Ato();
		
		if(processo.length() != 25) return false;
		
		long NNNNNNN = Integer.valueOf(processo.substring(0, 7));
		long DD = Integer.valueOf(processo.substring(8, 10));
		long AAAA = Integer.valueOf(processo.substring(11, 15));
		long JTR = Integer.valueOf(processo.substring(16, 17)) + Integer.valueOf(processo.substring(18, 20));
		long OOOO = Integer.valueOf(processo.substring(21));
		
		if(!valida_mod97(NNNNNNN, DD, AAAA, JTR, OOOO)) return false;
		
		ato.setProcesso(processo);
		
		if(observacao.length() > 250){
			observacao = observacao.substring(0, 249);
		}
		
		ato.setObservacao(observacao);
		ato.setStatusAtual(statusAtual);
		ato.setDataRegistro(dataRegistro);
		ato.setDataTermino(dataTermino);
		ato.setIdPrazo(idPrazo);
		ato.setIdProprietario(idProprietario);
		return persistencia.criar(ato);
	}
	
	public Ato ler(int idAto) {
		return persistencia.ler(idAto);
	}
	
	public boolean editar(int idAto, String processo, String observacao, String statusAtual, Date dataRegistro, Date dataTermino, int idPrazo, int idProprietario) {
		ato = new Ato();
		
		if(processo.length() != 25) return false;
		
		long NNNNNNN = Integer.valueOf(processo.substring(0, 7));
		long DD = Integer.valueOf(processo.substring(8, 10));
		long AAAA = Integer.valueOf(processo.substring(11, 15));
		long JTR = Integer.valueOf(processo.substring(16, 17)) + Integer.valueOf(processo.substring(18, 20));
		long OOOO = Integer.valueOf(processo.substring(21));
		
		if(!valida_mod97(NNNNNNN, DD, AAAA, JTR, OOOO)) return false;
		
		ato.setIdAto(idAto);
		ato.setProcesso(processo);
		
		if(observacao.length() > 250){
			observacao = observacao.substring(0, 249);
		}
		
		ato.setObservacao(observacao);
		ato.setStatusAtual(statusAtual);
		ato.setDataRegistro(dataRegistro);
		ato.setDataTermino(dataTermino);
		ato.setIdPrazo(idPrazo);
		ato.setIdProprietario(idProprietario);
		return persistencia.editar(ato);
	}

	public boolean deletar(int idAto) {
		return persistencia.deletar(idAto);
	}

	public List<Ato> listar(int idProprietario) {
		return persistencia.listar(idProprietario);
	}
	
	public boolean statusConcluido(int idAto) {
		return persistencia.statusConcluido(idAto);
	}
	
	public static String calcula_mod97(long NNNNNNN, long AAAA, long JTR, long OOOO) { 
		String valor1 = ""; 
		long resto1 = 0; 
		String valor2 = ""; 
		long resto2 = 0; 
		String valor3 = ""; 
		valor1 = preencheZeros(NNNNNNN, 7); 
		resto1 = Long.parseLong(valor1) % 97; 
		valor2 = preencheZeros(resto1, 2) + preencheZeros(AAAA, 4) + preencheZeros(JTR, 3); 
		resto2 = Long.parseLong(valor2) % 97; 
		valor3 = preencheZeros(resto2, 2) + preencheZeros(OOOO, 4) + "00"; 
		return preencheZeros(98 - (Long.parseLong(valor3) % 97), 2 ); 
	} 
	
	public static boolean valida_mod97(long NNNNNNN, long DD, long AAAA, long JTR, long OOOO) { 
		String valor1 = ""; 
		long resto1 = 0; 
		String valor2 = ""; 
		long resto2 = 0; 
		String valor3 = ""; 
		valor1 = preencheZeros(NNNNNNN, 7); 
		resto1 = Long.parseLong(valor1) % 97; 
		valor2 = preencheZeros(resto1, 2) + preencheZeros(AAAA, 4) + preencheZeros(JTR, 3); 
		resto2 = Long.parseLong(valor2) % 97; 
		valor3 = preencheZeros(resto2, 2) + preencheZeros(OOOO, 4) + preencheZeros(DD, 2); 
		return((Long.parseLong(valor3) % 97) == 1); 
	} 
	
	private static String preencheZeros(long numero, int quantidade) { 
		String temp = String.valueOf(numero); 
		String retorno = ""; 
		if(quantidade < temp.length()) {
			return temp; 
		}else{
			for(int i = 0; i < (quantidade - temp.length()); i++){
				retorno = "0" + retorno; 
			}
			
		return retorno + temp; 
		} 
	}
}
